﻿/*************************************************************************************
 * 文 件 名:   IHK_SimpleTaskSystem
 * 
 * 描    述:   简单版任务管理系统
 * 
 * 版    本：  V1.1
 * 创 建 者：  京产肠饭
 * 创建时间：  2021/10/31
 * 链   接：  https://gitee.com/JingChanChangFan/hk_-unity-tools
*************************************************************************************/

using System;
using System.Collections.Generic;
using QFramework;
using UnityEngine;

namespace HKTools
{
    public enum TaskQueueName
    {
        TQ_01,
        TQ_02,
        TQ_03,
        TQ_04
    }

    public enum TaskName
    {
        TQ_01_步骤01_放置干扰天线支架,
        TQ_01_步骤02_安装干扰天线,
        TQ_01_步骤03_连接干扰天线与干扰源,
        TQ_01_步骤04_放置抗干扰天线支架,
        TQ_01_步骤05_安装抗干扰天线,
        TQ_01_步骤06_连接抗干扰天线与电脑,
        TQ_01_步骤07_将干扰天线对准抗干扰天线,
        TQ_01_步骤08_放置标定天线,
        TQ_01_步骤09_标定天线连接频谱仪,
        TQ_01_步骤10_打开干扰机,
    }

    public interface IHK_SimpleTaskSystem : ISystem
    {
        /// <summary>
        /// 初始化一个任务流程
        /// </summary>
        void InitTaskQueue(TaskQueueName queueName, Action startAction, Action finishAction, List<HK_TaskItem> taskList);
        void StartTaskQueue(TaskQueueName queueName);
        void ClearTaskQueue(TaskQueueName queueName);
        void AddTask(TaskQueueName queueName, List<HK_TaskItem> taskList);
        void NextTask(TaskQueueName queueName);
        void CompleteAppointTask(TaskQueueName queueName, TaskName taskName);
    }

    public class HK_SimpleTaskSystem : AbstractSystem, IHK_SimpleTaskSystem
    {
        Dictionary<TaskQueueName, HK_TaskQueue> TaskQueueDic;
        List<TaskQueueName> initedQueueList;

        protected override void OnInit()
        {
            TaskQueueDic = new Dictionary<TaskQueueName, HK_TaskQueue>();
            initedQueueList = new List<TaskQueueName>();
        }

        /// <summary>
        /// 初始化一个任务流程
        /// </summary>
        public void InitTaskQueue(TaskQueueName queueName, Action startAction, Action finishAction, List<HK_TaskItem> taskList)
        {
            if (initedQueueList.Contains(queueName))
            {
                Debug.Log("流程初始化失败，该任务流程已经被使用过");
                return;
            }

            HK_TaskQueue taskQueue = new HK_TaskQueue(startAction, finishAction, taskList);
            TaskQueueDic.Add(queueName, taskQueue);

            initedQueueList.Add(queueName);
        }

        // 添加任务
        public void AddTask(TaskQueueName queueName, List<HK_TaskItem> taskList)
        {
            TaskQueueDic[queueName].AddTask(taskList);
        }

        // 开始任务
        public void StartTaskQueue(TaskQueueName queueName)
        {
            TaskQueueDic[queueName].StartTask();
        }

        // 清空任务
        public void ClearTaskQueue(TaskQueueName queueName)
        {
            TaskQueueDic[queueName].ClearTask();
        }

        // 下一个任务
        public void NextTask(TaskQueueName queueName)
        {
            TaskQueueDic[queueName].NextTask();
        }

        // 根据任务名，完成指定的任务步骤
        public void CompleteAppointTask(TaskQueueName queueName, TaskName taskName)
        {
            TaskQueueDic[queueName].CompleteAppointTask(taskName);
        }
    }

    public class HK_TaskQueue
    {
        // 开始任务时的回调
        public Action OnStartCallback = null;
        // 完成所有任务的回调
        public Action OnFinishCallback = null;
        // 任务队列
        public Queue<HK_TaskItem> taskQueue;

        public HK_TaskItem currentTask;

        int taskNum = 0;
        int taskCount = 0;

        // 当前任务进度
        public float TaskProcess
        {
            get { return taskNum * 1.0f / taskCount; }
        }

        public HK_TaskQueue(Action onStartCallback, Action onFinishCallback, List<HK_TaskItem> taskList)
        {
            this.OnStartCallback = onStartCallback;
            this.OnFinishCallback = onFinishCallback;
            this.taskQueue = new Queue<HK_TaskItem>();

            for (int i = 0; i < taskList.Count; i++)
            {
                taskQueue.Enqueue(taskList[i]);
            }

            taskCount = taskQueue.Count;

            taskNum = -1;
        }

        public void AddTask(List<HK_TaskItem> taskList)
        {
            for (int i = 0; i < taskList.Count; i++)
            {
                taskQueue.Enqueue(taskList[i]);
            }
        }

        public void StartTask()
        {
            if (OnStartCallback != null)
                OnStartCallback();

            NextTask();
        }

        public void NextTask()
        {
            if (taskQueue.Count > 0)
            {
                HK_TaskItem task = taskQueue.Dequeue();
                currentTask = task;
                task.initAction();

                taskNum++;
            }
            else
            {
                if (OnFinishCallback != null)
                    OnFinishCallback();
            }

            Debug.Log(TaskProcess);
        }

        // 根据任务名，完成指定的任务步骤
        public void CompleteAppointTask(TaskName taskName)
        {
            if (currentTask.taskName == taskName)
                NextTask();
            else
                Debug.Log("当前任务不匹配");
        }

        public void ClearTask()
        {
            taskQueue.Clear();
        }
    }

    public class HK_TaskItem
    {
        // 任务名
        public TaskName taskName;

        // 任务描述
        public string taskDescribe;

        // 具体任务内容，外部传入
        public Action initAction;

        public HK_TaskItem(Action initAction, TaskName taskName, string taskDescribe)
        {
            this.initAction = initAction;
            this.taskName = taskName;
            this.taskDescribe = taskDescribe;
        }
    }
}